﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using VgoCardChange.Models;
using VgoCardChange.Models.Objects;
using VgoCardChange.Models.DAL;
using VgoCardChange.Models.Objects.CardApi;
using System.Globalization;
using System.IO;
using System.Drawing;
using System.Text;
using System.Drawing.Drawing2D;

namespace VgoCardChange.Controllers
{
    public class CardBillController : Controller
    {
        //
        // GET: /CardBill/
        AdminModels adm;
        public ActionResult Index()
        {
           adm = new AdminModels();
            //Get cardType list
            ViewData["SupplierLst"] = new SelectList(adm.GetListCardSupplier(), "CardSupplierID", "CardSupplierName");

            //Get game list
            GameModels gmd = new GameModels();
            ViewData["GameID"] = new SelectList(gmd.GetGames(), "GameID", "GameName");
            //get captcha
            DirectoryInfo dr = new DirectoryInfo(Server.MapPath("/Content/Images"));
            foreach (FileInfo f in dr.GetFiles())
            {
                f.Delete();
            }
            ViewData["ImageUrl"] = CreateCaptcha();
            return View();
        }
        #region getgame 
        public ActionResult GetGame() 
        {
           
            return View();
        }
        #endregion
        #region Submit nap the
        [HttpPost]
        public ActionResult CardBill(string SupplierLst, string cardNumber, string seriNumber, TransactionLog transLog, Account acc, User user) 
        {
            //Create object to call Model Save log to data
            CardBillModels cardModels = new CardBillModels();
            /*Create object to connect data*/
            ConnectDB objData = new ConnectDB();

             //Create UserModel object to get UserID
             UserModels usmd = new UserModels();

            //Get Card info
            RequestInfo info = new RequestInfo();
            //Merchant site id
            info.Merchant_id = "34783";
            //Email when card charging
            info.Merchant_acount = "quachcongxuat@gmail.com";
            //Password to communicate with merchant site
            info.Merchant_password = "123456sa";


            //Remove Space
            string SupplierLst1 = SupplierLst.Trim().ToString();
            //Card provider
            info.CardType = SupplierLst1;
            info.Pincard = cardNumber;

            info.Refcode = (new Random().Next(0, 10000)).ToString();
            info.SerialCard = seriNumber;
            ResponseInfo resutl = NLCardLib.CardChage(info);  

            //get userName
            if (Session["UserName"] != null)
            {
                user.UserName = Session["UserName"].ToString();
            }
            else 
            {
                ViewData["SessionTimeout"] = "Hết phiên làm việc mời bạn đăng nhập lại để thực hiện tiếp giao dịch";
                Response.Redirect("/User/Login");
            }

            if (resutl.Errorcode.Equals("00"))
            {
             
                try
                {
                   user.UserID =  usmd.GetUserID(user.UserName);
                   transLog.TransID = resutl.TransactionID;
                   transLog.IpAddress = Server.HtmlEncode(Request.UserHostAddress);
                   transLog.UserAgent = "Chrome+";
                   transLog.UserID = user.UserID;
                   transLog.TransDate = DateTime.Now;
                   transLog.TransStatus = "Giao dịch thành công!!";
                   transLog.CardSupplierID = SupplierLst1;
                   acc.GameID = transLog.GameID;
                   if (resutl.Card_amount != String.Empty)
                   {
                       transLog.Money = double.Parse(resutl.Card_amount, CultureInfo.InvariantCulture);
                   }
                   else
                       transLog.Money = 0;
                   transLog.Bonus = (transLog.Money * cardModels.GetBonus(DateTime.Now, SupplierLst1))/100;
                   transLog.CardNumber = cardNumber;
                   transLog.SeriNumber = seriNumber;
                   transLog.Description = resutl.Message;
                   //Begin transaction
                   try
                   {
                       objData.BeginTrans();
                       //Save transaction Log 
                       cardModels.SaveLog(transLog);
                       //Add money to user Account
                       cardModels.UpdateAmount(transLog, acc, user);
                       //Save change
                       objData.CommitTrans();
                   }catch(Exception)
                   {
                       objData.RollBackTrans();
                   }
                }catch(Exception ex)
                {
                    Console.WriteLine(ex);
                }
                finally
                {
                    objData.CloseData();
                    objData = null;
                }
            }
            else
            {
                user.UserID = usmd.GetUserID(user.UserName);
                //Guid _guid = Guid.NewGuid();
                //transLog.TransID = _guid.ToString();
                transLog.IpAddress = Server.HtmlEncode(Request.UserHostAddress);
                transLog.UserAgent = "Chrome";
                transLog.UserID = user.UserID;
                transLog.TransDate = DateTime.Now;
                transLog.TransStatus = "Giao dịch Không thành công!!";
                transLog.CardSupplierID = SupplierLst1;
                if (resutl.Card_amount != String.Empty)
                {
                    transLog.Money = double.Parse(resutl.Card_amount, CultureInfo.InvariantCulture);
                }
                else
                   transLog.Money = 0;
                transLog.Bonus = cardModels.GetBonus(transLog.TransDate, SupplierLst1);
                transLog.CardNumber = cardNumber;
                transLog.SeriNumber = seriNumber;
                transLog.Description = resutl.Message;
                acc.GameID = transLog.GameID;
                //Check tranglog ID
                if (!cardModels.CheckTranLogID("00000001"))
                {
                    transLog.TransID = "00000001";
                }
                else if (cardModels.CheckTranLogID(""))
                {
                    Random ran1 = new Random();
                    int tranID2 = ran1.Next(1, 1000);
                    if (!cardModels.CheckTranLogID(tranID2.ToString()))
                    {
                        transLog.TransID = "0000" + tranID2.ToString();
                        tranID2++;
                    }
                    else
                    {
                        tranID2 += 1;
                        transLog.TransID = tranID2.ToString();
                    }
                }
                else 
                {
                    int tranID = 00000001;
                    tranID += 1;
                    if (!cardModels.CheckTranLogID("0000000" + tranID.ToString()))
                    {
                        transLog.TransID = tranID.ToString();
                        tranID++;
                    }
                    else 
                    {
                        Random ran = new Random();
                        int tranID1 = ran.Next(1, 1000);
                        if (!cardModels.CheckTranLogID(tranID1.ToString()))
                        {
                            transLog.TransID = "0000" + tranID1.ToString();
                            tranID1++;
                        }
                        else 
                        {
                            tranID1 += 1;
                            transLog.TransID = tranID1.ToString();
                        }
                    }
                }
                cardModels.SaveLog(transLog);
                ViewData["GiaoDichLoi"] = "Giao dịch không thành công: " + resutl.Message;
            }
            //return RedirectToAction("Index");
            return View("Submit");
        }
        #endregion
        #region Mã capthca
        //Hàm trả về chuỗi captcha
        public string getCaptCha()
        {
            return Session["captcha"].ToString();
        }
        //Hàm trả về đường dẫn của tập tin hình.
        public string CreateCaptcha()
        {
            const byte LENGTH = 5;
            // chiều dài chuỗi để lấy các kí tự sẽ sử dụng cho captcha
            const string chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
            using (Bitmap bmp = new Bitmap(120, 35))
            {
                using (Graphics g = Graphics.FromImage(bmp))
                {
                    // Tạo nền cho ảnh dạng sóng
                    HatchBrush brush = new HatchBrush(HatchStyle.Percent80, Color.White, Color.Tan);
                    g.FillRegion(brush, g.Clip);
                    // Lưu chuỗi captcha trong quá trình tạo
                    StringBuilder strCaptcha = new StringBuilder();
                    Random rand = new Random();
                    float locationX = 3;
                    for (int i = 0; i < LENGTH; i++)
                    {
                        // Lấy kí tự ngẫu nhiên từ mảng chars
                        SolidBrush brushes = new SolidBrush(GetRandomColor());
                        string str = chars[rand.Next(chars.Length)].ToString();
                        strCaptcha.Append(str);
                        // Tạo font với tên font ngẫu nhiên chọn từ mảng fonts
                        Font font = new Font("Times New Roman", new Random().Next(14, 17), FontStyle.Bold);
                        // Lấy kích thước của kí tự
                        SizeF size = g.MeasureString(str, font);
                        // Vẽ kí tự đó ra ảnh tại vị trí tăng dần theo i, vị trí top ngẫu nhiên
                        g.DrawString(str, font, brushes, locationX, rand.Next(2, 10));
                        font.Dispose();
                        //định location X
                        locationX += size.Width + i;
                    }
                    // Lưu captcha vào session
                    Session["captcha"] = strCaptcha.ToString();
                    // Ghi ảnh trực tiếp ra luồng xuất theo định dạng gif
                    //Response.ContentType = "image/GIF";4
                    int numRandom = new Random().Next(1, 3000);
                    string imgFile = "captcha" + numRandom + ".jpg";
                    string directoryCaptcha = "/Content/Images/Captcha";
                    // Kiểm tra thư mục đã tồn tại
                    if (!Directory.Exists(Server.MapPath(directoryCaptcha)))
                    {
                        Directory.CreateDirectory(Server.MapPath(directoryCaptcha));
                    }
                    //lấy thông tin thư mục
                    DirectoryInfo direcInfo = new DirectoryInfo(Server.MapPath(directoryCaptcha));
                    foreach (FileInfo file in direcInfo.GetFiles(".jpg"))
                    {
                        try
                        {
                            //Xóa tất cả các tập tin hình trong thư mục hiện tại
                            file.Delete();
                        }
                        catch (Exception ex)
                        {
                            Console.Write(ex);
                        }
                    }
                    bmp.Save(Server.MapPath(directoryCaptcha + imgFile));
                    return directoryCaptcha + imgFile;
                }
            }
        }

        int rrandom = 0;
        int grandom = 0;
        int brandom = 0;
        //Hàm tạo ngẫu nhiên màu ảnh
        public Color GetRandomColor()
        {
            Random rnd = new Random();
            int ri = rnd.Next(255);
            if (ri == rrandom)
            {
                ri = rnd.Next(255);
            }
            else
            {
                rrandom = ri;
            }
            int gi = rnd.Next(255);
            if (gi == grandom)
            {
                gi = rnd.Next(255);
            }
            else
            {
                grandom = gi;
            }
            int bi = rnd.Next(255);
            if (bi == brandom)
            {
                bi = rnd.Next(255);
            }
            else
            {
                brandom = bi;
            }
            byte r = Convert.ToByte(ri);
            byte g = Convert.ToByte(gi);
            byte b = Convert.ToByte(bi);
            return Color.FromArgb(r, g, b);
        }
        #endregion
    }
}
